package hnlg.com.cn.config;
import javax.sql.DataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;

/**
 * Druid数据源配置[ˈdruːɪd]
 */
@Configuration	//此注解标注此Java类为一个配置类
public class DruidConfig {
	@Bean 
	@Primary 
	@ConfigurationProperties("spring.datasource") 
	public DataSource dataSource() {
		//阿里巴巴的druid连接池的创建：调用了阿里巴巴的提供的包
		return DruidDataSourceBuilder.create().build();
	}
	
	/*定义事务管理器的bean:spirng容器自动扫描到该方法，会产生一个对象，
	 * 注入到spring容器中，bean的名字没有指定则默认为方法的名称。
	   在服务层：我们用注解：@Transactional 就是以引用该事务管理器
	 */
	@Bean(name="txManager")
	@Primary
	public DataSourceTransactionManager  getTransactionManager() {
		/*上面的数据源做事务管理器的构造函数的参数
		 * 相当于将我们的conn连接对象/语句对象/结果集对象传入给事务管理器类
		 * */
		return new DataSourceTransactionManager(dataSource());
	}
    
	
}
/*
 * try{
 * conn.setAutoCommit(false);
 * 执行sql语句【在每一个方法外面套上这一层】事务管理器的作用
 * conn.commit();
 * }catch(Exception ex){
 * conn.rollback();
 * ex.printstack();
 * 
 * }
 * 
 */




/*
@Configuration 是一个类级别的注释，指示对象是bean定义的来源
@Bean方法只有在@Configuration类中声明方法时才有效。

@ConfigurationProperties：获取yml文件中的配置数据
@Primary 注解 ，则这个bean会被优先选用
Spring的@Bean注解用于告诉方法，产生一个Bean对象，然后这个Bean对象交给Spring管理。
产生这个Bean对象的方法Spring只会调用一次，
随后这个Spring将会将这个Bean对象放在自己的IOC容器中
注解类里的@Bean对象的id默认是方法名
*/
